CREATE TABLE #t1 (MyString VARCHAR(8000)) ;WITH Tally (n) AS ( SELECT TOP 100 ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM sys.all_columns a CROSS JOIN sys.all_columns b) INSERT INTO #t1 -- Modify % 300 to change the length of the test string SELECT REPLICATE('abc,0123,0hij,0456,0nopq,0789,0uvw1y', 1 + ABS(CHECKSUM(NEWID())) % 300) FROM Tally GO DECLARE @MyString VARCHAR(8000), @ItemNumber INT, @Item VARCHAR(8000) DECLARE @Pattern VARCHAR(500) = '%[^,0]%' PRINT '--- Split on Pattern , delimiter' SET STATISTICS TIME ON --SELECT MyString, ItemNumber, Item, [Matched] SELECT @MyString=MyString, @ItemNumber=ItemNumber, @Item=Item FROM #t1 CROSS APPLY PatternSplitCM(MyString, '%[^,]%') WHERE Matched = 1 SET STATISTICS TIME OFF PRINT '--- DelimitedSplit8K on , (single char) delimiter' SET STATISTICS TIME ON --SELECT MyString, ItemNumber, Item SELECT @MyString=MyString, @ItemNumber=ItemNumber, @Item=Item FROM #t1 CROSS APPLY DelimitedSplit8K(MyString, ',') SET STATISTICS TIME OFF DROP TABLE #t1